home *** CD-ROM | disk | FTP | other *** search
/ Aminet 1 (Walnut Creek) / Aminet - June 1993 [Walnut Creek].iso / usenet / sources / volume91 / utilitys / dog_1_11 / part01 / dog.c next >
C/C++ Source or Header  |  1991-07-04  |  3KB  |  149 lines

  1. /*
  2.   DOG
  3.  
  4.   Create a rename script
  5.   to unmangle the ms-dog
  6.   filenameing convention
  7.  
  8.   Version 1.11
  9.  
  10.   --
  11.  
  12.   If you have net access on a unix box, but have to transport software
  13.   through an ms-dos machine to get is to your amiga, no doubt you hate
  14.   the fact that ms-dog cannot support full amiga filenames.
  15.  
  16.   This is no longer a problem now that you have DOG.
  17.  
  18.   Compile DOG on your local unix box, and then run it with the command
  19.   line:
  20.       DOG [filenames]
  21.  
  22.   DOG will create a file called !RENAME in the current directory and will
  23.   rename all the specified files to have names that are unique to a dos
  24.   machine.
  25.  
  26.   Now transport the files to your amiga, via the dog-box and type the line
  27.   on your amiga:
  28.       Execute !RENAME
  29.  
  30.   Now all your files are called what they were originally!
  31.  
  32.   If you want to un-DOG the files on a unix box instead, then type:
  33.       /bin/csh !RENAME
  34.  
  35.   And the files will be returned.
  36.  
  37.   --
  38.  
  39.   (c) 1991 Phil Kernick / Wizard Software
  40.  
  41.   This program is freely distributable as long as
  42.   the above copyright message is left intact.
  43.  
  44.   Please send any bugs or comments to:
  45.       phil@adam.adelaide.edu.au
  46.  
  47.       Phil Kernick
  48.       304 South Terrace
  49.       Adelaide
  50.       SA  5000
  51.       AUSTRALIA
  52. */
  53.  
  54. #include <stdio.h>
  55. #include <ctype.h>
  56. #include <string.h>
  57.  
  58. #define min(a,b)  ((a) < (b) ? (a) : (b))
  59. #define max(a,b)  ((a) > (b) ? (a) : (b))
  60.  
  61. #define DUMPFILE  "!RENAME"
  62.  
  63. char doschar[] = "\
  64. XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX!XX$%&'()XXX-.X0123456789XXXXXX\
  65. @ABCDEFGHIJKLMNOPQRSTUVWXYZXXX^_`ABCDEFGHIJKLMNOPQRSTUVWXYZ{X}XX\
  66. XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\
  67. XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX";
  68.  
  69. typedef char (*fnp)[13];
  70.  
  71. main(argc, argv)
  72. int argc;
  73. char **argv;
  74. {
  75.   int fname, dot, node, rpt;
  76.   char buffer[256], ext[8], *cc, *dd;
  77.   fnp dosfile;
  78.   FILE *fp;
  79.  
  80.   dosfile = (fnp) malloc(argc * sizeof(*dosfile));
  81.  
  82.   strcpy(dosfile[0], DUMPFILE);
  83.  
  84.   for (fname = 1; fname < argc; fname++)
  85.   {
  86.     for (dot = 0, cc = argv[fname], dd = buffer; *cc; cc++, dd++)
  87.       *dd = ((*cc == '.') ? (dot++ ? 'X' : '.') : doschar[*cc]);
  88.  
  89.     *dd = '\0';
  90.  
  91.     for (dot = 0, dd = buffer, cc = dosfile[fname];
  92.         (dot < 8) && *dd && (*dd != '.'); dot++)
  93.       *cc++ = *dd++;
  94.  
  95.     node = dd - buffer;
  96.  
  97.     if (*dd != '.')
  98.       for (; *dd && (*dd != '.'); dd++) ;
  99.  
  100.     for (dot = 0; (dot < 4) && *dd; dot++)
  101.       *cc++ = *dd++;
  102.  
  103.     *cc = '\0';
  104.  
  105.     for (dot = 0; dot < fname; dot++)
  106.       if (strcmp(dosfile[dot], dosfile[fname]) == 0)
  107.       {
  108.     if (node != 8)
  109.       rpt = 1;
  110.     else
  111.     {
  112.       for (cc = &dosfile[fname][node - 1]; isdigit(*cc); --cc) ;
  113.       rpt = atoi(++cc) + 1;
  114.     }
  115.     sprintf(buffer, "%0d", rpt);
  116.     strcpy(ext, &dosfile[fname][node]);
  117.     rpt = max(8 - strlen(buffer) - node, 0);
  118.     for (dd = buffer + strlen(buffer), cc = dosfile[fname] + 8;
  119.         dd >= buffer;)
  120.       *cc-- = *dd--;
  121.     for (; rpt > 0; rpt--)
  122.       *cc-- = '0';
  123.     strcat(dosfile[fname], ext);
  124.     dot = -1;
  125.       }
  126.   }
  127.  
  128.   for (node = 0, fname = 1; fname < argc; fname++)
  129.     if (strcmp(argv[fname], DUMPFILE) != 0)
  130.     {
  131.       if (strcmp(dosfile[fname], argv[fname]) != 0)
  132.       {
  133.     if (!node)
  134.     {
  135.       fp = fopen(DUMPFILE, "w");
  136.       fprintf(fp, "; alias rename mv\n");
  137.       node = !node;
  138.     }
  139.     fprintf(fp, "rename %s \"%s\"\n", dosfile[fname], argv[fname]);
  140.     rename(argv[fname], dosfile[fname]);
  141.       }
  142.     }
  143.  
  144.   if (node)
  145.     fclose(fp);
  146.  
  147.   free((char *) dosfile);
  148. }
  149.